package com.yunpeng.aidevice.biz.service;

import com.yunpeng.common.dto.Result;
import com.yunpeng.aidevice.common.dto.save.OrgSaveDTO;
import com.yunpeng.aidevice.common.vo.SimpleEntityVO;
import com.yunpeng.aidevice.common.vo.org.OrganizationNodeVO;
import com.yunpeng.aidevice.common.vo.org.OrganizationRootVO;
import com.yunpeng.aidevice.common.vo.org.OrganizationVO;

import java.util.List;

/**
 * IOrganizationApi 组织机构业务服务
 *
 * @author : Moore(hemw)
 * @date : 2020-04-08
 */
public interface IOrganizationBizService {

    /**
     * 获取用户归属的顶级组织节点信息
     *
     * @param userCode             用户代码
     * @param merchantCode         商户代码
     * @param userOrganizationPath 用户归属的组织路径
     * @return
     */
    Result<OrganizationRootVO> getRoot(String userCode, String merchantCode, String userOrganizationPath);

    /**
     * 新增组织机构节点
     *
     * @param orgSaveDTO   节点保存信息
     * @param operatorCode 操作人名称
     * @return
     */
    Result<String> addNew(OrgSaveDTO orgSaveDTO, String operatorCode);

    /**
     * 获取指定节点的树结构（本身和下级）
     *
     * @param nodeCode     节点代码
     * @param nodeCode     节点代码
     * @param merchantCode 商户代码
     * @return
     */
    Result<OrganizationNodeVO> getOrganizationTree(String nodeCode, String merchantCode);

    /**
     * 删除组织
     *
     * @param nodeCode     组织机构代码
     * @param merchantCode 商户代码
     * @return
     */
    Result<Void> removeOrganization(String nodeCode, String merchantCode);

    /**
     * 禁用组织（及其下级组织）
     *
     * @param nodeCode     组织代码
     * @param merchantCode 商户代码
     * @param operatorCode 操作人代码
     * @return
     */
    Result<Void> disableOrganization(String nodeCode, String merchantCode, String operatorCode);

    /**
     * 启用组织（及其下级组织）
     *
     * @param nodeCode     组织代码
     * @param merchantCode 商户代码
     * @param operatorCode 操作人代码
     * @return
     */
    Result<Void> enableOrganization(String nodeCode, String merchantCode, String operatorCode);

    /**
     * 更新组织机构
     *
     * @param orgSaveDTO   组织保存信息
     * @param operatorCode 操作人代码
     * @return
     */
    Result<Void> updateOrganization(OrgSaveDTO orgSaveDTO, String operatorCode);

    /**
     * 获取组织详情
     *
     * @param organizationCode 组织机构代码
     * @param merchantCode     商户代码
     * @return
     */
    Result<OrganizationVO> getOrganizationDetail(String organizationCode, String merchantCode);

    /**
     * 组织机构下拉数据
     *
     * @param merchantCode
     * @param tenantCode
     * @return
     */
    Result<List<SimpleEntityVO>> dropDownList(String merchantCode, String tenantCode);
}
